/*
斐波那契数列大家都非常熟悉。它的定义是：

f(x)=1....(x=1,2)

f(x)=f(x−1)+f(x−2)....(x>2)
对于给定的整数 n 和 m，我们希望求出：

f(1)+f(2)+…+f(n) 的值。

但这个值可能非常大，所以我们把它对 f(m) 取模。

但这个数字依然很大，所以需要再对 p 求模。

输入格式
输入包含多组数据。

每组数据占一行，包含三个整数 n,m,p。

输出格式
每组数据输出一个整数，表示答案。

每个数占一行。

数据范围
0<n,m,p<1018
测试数据不超过100组

输入样例1：
2 3 5
输出样例1：
0
输入样例2：
15 11 29
输出样例2：
25
*/
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
const int N = 3;
typedef long long LL;
LL n, m, p, res;
void mul(LL c[], LL a[], LL b[][N])
{
    LL temp[N] = {0};
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            temp[i] = (temp[i] + a[j] * b[j][i]) % p;
    memcpy(c, temp, sizeof temp);
}
void mul(LL c[][N], LL a[][N], LL b[][N])
{
    LL temp[N][N] = {0};
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            for (int k = 0; k < N; k++)
                temp[i][j] = (temp[i][j] + a[i][k] * b[k][j]) % p;
    memcpy(c, temp, sizeof(temp));
}
int main()
{
    cin >> n >> m >> p;
    LL f1[N] = {1, 1, 1};
    LL a[N][N] = {
        {0, 1, 0},
        {1, 1, 1},
        {0, 0, 1}};
    n--;
    while (n)
    {
        if (n & 1)
            mul(f1, f1, a);
        mul(a, a, a);
        n >>= 1;
    }
    cout << f1[2] << endl;
    return 0;
}
